# -*- coding: utf-8 -*-
'''
Created on 1 янв. 2014
@author: av
'''
import os.path, sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from polylinelist import *
from polyline import *
from point import *
import random

iface = None

'''
отрисовка в QGIS
'''

class Draw():
    '''
    класс для отрисовки  в QGIS
    '''
     
    def __init__(self, iface):
        '''
        Constructor'''
        self.iface = iface
        self.canvas = self.iface.mapCanvas()

    def getParcelID (self):
        '''Генерируем id для земельного участка
        ''' 
        return random.randint(1, 10000000)

    def writeToQgisLayer(self, boudaryList, idParcel):
        '''Пишем в слой  "земельные участки данные о земельном участке импортированные из XML
        возвращает id земельного участка в базе 
        ''' 
        layer = self.get_vector_layer_by_name(u'земельные участки')
        feat = QgsFeature()
        # FIXME:сделать проверки и удаление повторяющихся точек на концах линий и замыкание полигона, импортируетя но всякая фигнф получается

        # список точек для отрисовки в QGIS 
        QgsPointsPointList = []
        bl = []
        bl = boudaryList
        p = Point()
        i = Polyline()
        num = 0
        # перебираем полилинии в списке полилиний
        for i in bl:
            # перебираем точки для выбранной полилинии
            for p in i.points:
                qp = QgsPoint(float(p.Y), float(p.X))
                QgsPointsPointList.append(qp)
                num += 1
                QgsMessageLog.logMessage(str(num), 'Landax')

        feat.setGeometry(QgsGeometry.fromPolygon([QgsPointsPointList]))    
        feat.initAttributes(len(layer.dataProvider().attributeIndexes()))
        feat.setAttribute(layer.fieldNameIndex(u'CoordSys'), 'CoordSys')
        feat.setAttribute(layer.fieldNameIndex(u'id'), idParcel)
        layer.dataProvider().addFeatures([ feat ])
        return
    
    def doDrawPoints (self, pointsList,idParcel):
        '''
        принимает список точек и id земучастка
        рисует точки из XML на слое "точки" QGIS
        '''
        layer = self.get_vector_layer_by_name(u'точки')
        for point in pointsList:
                if QgsVectorDataProvider.AddFeatures:
                    feat = QgsFeature()
                    x = float(point.X)
                    y = float(point.Y)
                    feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(y, x)))
                    feat.initAttributes(len(layer.dataProvider().attributeIndexes()))
                    feat.setAttribute(layer.fieldNameIndex(u'PN'), point.PN)
                    feat.setAttribute(layer.fieldNameIndex(u'UIDP'), point.UIDP)
                    feat.setAttribute(layer.fieldNameIndex(u'idParcel'), idParcel)
                    (res, outFeats) = layer.dataProvider().addFeatures([ feat ])
                    
    def doDrawLines (self, polylineList, idParcel):
        '''рисуем линии по полученному списку линий'''
        layer = self.get_vector_layer_by_name(u'линии')
        for polyline in polylineList:
            feat = QgsFeature()
            qpList = []
            for point in polyline.points:
                qPoint = QgsPoint(float(point.Y), float(point.X))
                qpList.append(qPoint)
            feat.setGeometry(QgsGeometry.fromPolyline(qpList))
            feat.initAttributes(len(layer.dataProvider().attributeIndexes()))
            feat.setAttribute(layer.fieldNameIndex(u'ULID'), polyline.ULID)
            feat.setAttribute(layer.fieldNameIndex(u'length'), polyline.length)
            feat.setAttribute(layer.fieldNameIndex(u'idParcel'), idParcel)
            layer.dataProvider().addFeatures([ feat ])
    
    def doDrawAdjacentUnits (self, adjacentUnitsList, idParcel):
        adjacentUnitsList=[]
        self.adjacentUnitsList=adjacentUnitsList
        for adjacentUnits in adjacentUnitsList:
            adjacentUnits.findtext('UIDP')
                           
    def get_vector_layer_by_name(self, lyr_name):
        """
        Return QgsVectorLayer from a layer name ( as string )
        Use fTools code
        """
        layermap = QgsMapLayerRegistry.instance().mapLayers()
        for name, layer in layermap.iteritems():
            if layer.type() == QgsMapLayer.VectorLayer and layer.name() == lyr_name:
                if layer.isValid():
                    return layer
                else:
                    return None
        return None

    def set_stiggers(self):
        QgsMessageLog.logMessage(u'Установка триггеров.', u'Landax')
        layermap = QgsMapLayerRegistry.instance().mapLayers()
        for name, layer in layermap.iteritems():
            if layer.type() == QgsMapLayer.VectorLayer:
                if layer.isValid():
                    #QObject.connect(layer, SIGNAL("layerModified()"), layerModified)
                    QObject.connect(layer, SIGNAL("geometryChanged(QgsFeatureId, QgsGeometry)"), geometryChanged)
                    layer.featureAdded.connect(featureAdded)
                    layer.featureDeleted.connect(featureDeleted)
        return
    
def geometryChanged(fID, fGeom):
    QgsMessageLog.logMessage(u'Изменена геометрия объекта.'+str(fID)+str(fGeom), u'Landax')
    return
def featureAdded():
    QgsMessageLog.logMessage(u'Создан новый объект.', u'Landax')
    return
def featureDeleted():
    QgsMessageLog.logMessage(u'Объект удалён.', u'Landax')
    return
def layerModified():
    QgsMessageLog.logMessage(u'Слой изменён.', u'Landax')
    return    
    
    
